Description
折叠的定义如下:
$1.$ 一个字符串可以看成它自身的折叠。记作 $S=S$.
$2.$ $X(S)$ 是 $X(X>1)$ 个 $S$ 连接在一起的串的折叠。记作 $X(S)=SSSS…S$ ( $X$ 个 $S$ )。
如果 $A=A’$, $B=B’$,则 $AB=A’B’$ 例如,因为 $3(A)=AAA$, $2(B)=BB$,所以 $3(A)C2(B)=AAACBB$,而 $2(3(A)C)2(B)=AAACAAACBB$
求给定字符串的最短折叠。
数据范围:$len<=100$
Solution
设 $f[i][j]$ 为表示区间 $[i,j]$ 折叠的最小长度。 $get(i,j,k,h)$ 表示区间 $[i,j]$ 和区间 $[k,h]$ 能否折叠。
如果能够折叠:$f[i][j]=min(f[i][j],f[i][k]+2+cal((j-i+1)/(k-i+1)))$ (其中 $cal(x)$ 返回的是 $x$ 的位数)
否则:$f[i][j]=min(f[i][j],f[i][k]+f[k+1][j])$
Code
1 |
|